package com.yootk.service.impl;

import com.yootk.common.service.abs.AbstractService;
import com.yootk.common.util.factory.DAOFactory;
import com.yootk.dao.IMemberDAO;
import com.yootk.service.IMemberService;
import com.yootk.vo.Member;

import java.util.*;

/**
 * 业务层实现类
 */
public class MemberServiceImpl extends AbstractService implements IMemberService {
    // 业务层的实现依赖于数据层，所以要获取数据层接口的相关实例
    private IMemberDAO memberDAO = DAOFactory.getDAOInstance("member.dao", IMemberDAO.class);

    @Override
    public boolean add(Member vo) throws Exception {
        if (!super.checkAge(vo.getAge())) {  // 判断给定的年龄是否合法
            return false;
        }
        if (!super.checkSex(vo.getSex())) {  // 判断给定的性别是否合法
            return false;
        }
        if (this.memberDAO.findById(vo.getMid()) == null) { // 无法获取指定id的数据
            if (this.memberDAO.findByEmail(vo.getEmail()) == null) {    // email地址不存在
                return this.memberDAO.doCreate(vo); // 数据增加
            }
        }
        return false; // 无法注册
    }

    @Override
    public boolean edit(Member vo) throws Exception {
        if (!super.checkAge(vo.getAge())) {  // 判断给定的年龄是否合法
            return false;
        }
        if (!super.checkSex(vo.getSex())) {  // 判断给定的性别是否合法
            return false;
        }
        // 判断当前更新的email数据是否存在
        Member emailMember = this.memberDAO.findByEmail(vo.getEmail());
        if (!emailMember.getMid().equals(vo.getMid())) { // 这个email地址不是当前用户的地址
            return false;
        } else {
            return this.memberDAO.doEdit(vo);
        }
    }

    @Override
    public boolean removeById(String... ids) throws Exception {
        if (ids.length == 0) {  // 判断数组长度
            return false;
        }
        // 防止可能设置了重复的删除用户id信息，所以可以将数据保存在Set集合之中
        Set<String> set = new HashSet<>();
        set.addAll(Arrays.asList(ids)); // 将数组转为List，而后保存在Set集合中
        return this.memberDAO.doRemove(set); // 数据删除
    }

    @Override
    public Member get(String id) throws Exception {
        return this.memberDAO.findById(id);
    }

    @Override
    public List<Member> list() throws Exception {
        return this.memberDAO.findAll();
    }

    @Override
    public Map<String, Object> split(Integer currentPage, Integer lineSize, String column, String keyword) throws Exception {
        Map<String, Object> map = new HashMap<>();
        // 在使用LIKE进行数据查询时，由于存在有逐行匹配的问题，那么性能很差
        if (super.checkEmpty(column, keyword)) {    // 判断数据是否为空
            map.put("allMembers", this.memberDAO.findSplit(currentPage, lineSize));
            map.put("allRecorders", this.memberDAO.getAllCount());
        } else {    // 数据不为空
            map.put("allMembers", this.memberDAO.findSplit(currentPage, lineSize, column, keyword));
            map.put("allRecorders", this.memberDAO.getAllCount(column, keyword));
        }
        return map;
    }
}
